package Day_0202.Spring;

/**
 * @author zxc
 * @date 2023/02/02 20:50
 **/
public class Spring_Design_Pattern {
    public static void main(String[] args) {
        /**
         * Spring中所使用到的设计模式
         * ===》
         * 这是一道相对有难度的题目，你不仅要回设计模式，还要知道每个设计模式在Spring中是如何使用的。
         *
         * 1.简单工厂模式：
         * （1）Spring 中的 BeanFactory 就是简单工厂模式的体现。
         *  根据传入一个唯一的标识来获得 Bean 对象，但是在传入参数后创建还是传入参数前创建，要根据具体情况来定。
         *
         * 2.工厂模式：
         * （1）Spring 中的 FactoryBean 就是典型的工厂方法模式，实现了 FactoryBean 接口的 bean，是一类叫做factory的 bean。
         *  其特点是，spring 在使用 getBean() 调用获得该 bean 时，会自动调用该 bean 的 getObject() 方法，
         *  所以返回的不是 bean，而是这个 bean.getOjbect()方法的返回值。
         *
         * 3.单例模式：
         * （1）在 spring 中用到的单例模式有： scope="singleton" ，注册式单例模式，bean 存放于Map 中。
         *  bean name 当做 key，bean 当做 value。
         *
         * 4.原型模式：
         * （1）在 spring 中用到的原型模式有： scope="prototype" ，
         *  每次获取的是通过克隆生成的新实例，对其进行修改时对原有实例对象不造成任何影响。
         *
         * 5.迭代器模式：
         * （1）在 Spring 中有个 CompositeIterator 实现了Iterable 接口和 Iterator 接口，迭代相关的接口。
         * （2）可以这么认为，实现了 Iterable 接口，则表示某个对象是可被迭代的。
         * （3）Iterator 接口相当于是一个迭代器，实现了 Iterator 接口，等于具体定义了这个可被迭代的对象时如何进行迭代的。
         *
         * 6.代理模式：
         * Spring 中经典的 AOP，就是使用动态代理实现的，分 JDK 和 CGlib 动态代理。
         *
         * 7.适配器模式：
         * （1）Spring 中的 AOP 中 AdvisorAdapter 类，它有三个实现：
         *  MethodBeforAdviceAdapter、AfterReturnningAdviceAdapter、ThrowsAdviceAdapter。
         * （2）Spring会根据不同的 AOP 配置来使用对应的 Advice，与策略模式不同的是，一个方法可以同时拥有多个Advice。
         *  Spring 存在很多以 Adapter 结尾的，大多数都是适配器模式。
         *
         * 8.观察者模式：
         * （1）Spring 中的 Event 和 Listener。
         * （2）spring 事件：
         *  ApplicationEvent，该抽象类继承了EventObject 类，JDK 建议所有的事件都应该继承自 EventObject。
         * （3）spring 事件监听器：
         *  ApplicationListener，该接口继承了 EventListener 接口，JDK 建议所有的事件监听器都应该继承EventListener。
         *
         * 9.模板模式：
         * Spring 中的 org.springframework.jdbc.core.JdbcTemplate 就是非常经典的模板模式的应用。
         *
         * 10.责任链模式：
         * （1）DispatcherServlet 中的 doDispatch() 方法中获取与请求匹配的处理器
         * （2）HandlerExecutionChain，this.getHandler() 方法的处理使用到了责任链模式。
         *
         * 注意：这里只是列举了部分设计模式，其实里面用到了还有享元模式、建造者模式等。
         */
    }
}
